// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement.  The various license agreements may be found at
// the Magic Software web site.  This file is subject to the license
//
// RESTRICTED USE SOURCE CODE
// http://www.magic-software.com/License/restricted.pdf

#ifndef MGCTEXTURE_H
#define MGCTEXTURE_H

#include "MgcColor.h"
#include "MgcImage.h"
#include "MgcObject.h"


class MgcTexture : public MgcObject
{
    MgcDeclareRTTI;
    MgcDeclareStream;

public:
    MgcTexture ();
    virtual ~MgcTexture ();

    void SetImage (MgcImage* pkImage);
    MgcImage* GetImage ();


    enum CorrectionMode
    {
        CM_AFFINE,
        CM_PERSPECTIVE,
        CM_QUANTITY
    };

    CorrectionMode& Correction ();


    enum ApplyMode
    {
        AM_REPLACE,
        AM_DECAL,
        AM_MODULATE,
        AM_BLEND,
        AM_QUANTITY
    };

    ApplyMode& Apply ();
    MgcColor& BlendColor ();


    enum WrapMode
    {
        WM_CLAMP_S_CLAMP_T,
        WM_CLAMP_S_WRAP_T,
        WM_WRAP_S_CLAMP_T,
        WM_WRAP_S_WRAP_T,
        WM_QUANTITY
    };

    WrapMode& Wrap ();


    enum FilterMode
    {
        FM_NEAREST,
        FM_LINEAR,
        FM_QUANTITY
    };

    FilterMode& Filter ();


    enum MipmapMode
    {
        MM_NONE,
        MM_NEAREST,
        MM_LINEAR,
        MM_NEAREST_NEAREST,
        MM_NEAREST_LINEAR,
        MM_LINEAR_NEAREST,
        MM_LINEAR_LINEAR,
        MM_QUANTITY
    };

    MipmapMode& Mipmap ();

    MgcReal& Priority ();
    unsigned int& UserData ();

protected:
    MgcImagePtr m_spkImage;
    CorrectionMode m_eCorrection;
    ApplyMode m_eApply;
    MgcColor m_kBlendColor;
    WrapMode m_eWrap;
    FilterMode m_eFilter;
    MipmapMode m_eMipmap;
    MgcReal m_fPriority;
    unsigned int m_uiUserData;
};

MgcSmartPointer(MgcTexture);
MgcRegisterStream(MgcTexture);
#include "MgcTexture.inl"

#endif
